package com.ylw.project.handler.impl;

import com.ylw.project.JavaDomain;
import com.ylw.project.Tools;
import com.ylw.project.handler.Handler;
import com.ylw.project.compile.ProjectSystem;
import com.ylw.project.handler.chain.HandlerChain;
import com.ylw.project.handler.chain.impl.HandlerChainImpl;
import com.ylw.util.Config;
import org.apache.log4j.Logger;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 责任链模式中的ClassHandler 用来处理class文件
 */
public class JavaHandler implements Handler {
    private static final Logger logger = Logger.getLogger(JavaHandler.class);

    /**
     * 检查该文件是否为java文件
     *
     * @param filePath
     * @return
     */
    private boolean isJavaFile(String filePath) {
        boolean result = false;
        result = filePath.endsWith(".java");
        return result;
    }









    /**
     * 通过java文件路径获取编译后的class文件路径,这里需要在config.properties里面配置顺序，
     * 因为在maven项目里面java目录在src\\main\\java这个目录下面，所以这个要配置在src前面
     *
     * @param javaPath
     * @return
     */
    private String getCompileClassFilePath(String javaPath) {
        String classFilePath = "";
        List javaRoot = Config.getPropertValue("project.source.java.root");
        String classCompileRoot = (String) Config.getPropertValue("project.compile.root").get(0);
        for (Object java : javaRoot) {
            if (javaPath.contains(java.toString())) {
                classFilePath = javaPath.replace(java.toString(), classCompileRoot + File.separator + Tools.getProjectName(javaPath, (String) java));
            }
        }
        classFilePath = classFilePath.replace(".java", ".class");
        return classFilePath;
    }




    @Override
    public Object handler(HandlerChain chain, String filePath) {
        if (isJavaFile(filePath)) {

            logger.info("handler javaPath: "+filePath);

            JavaDomain domain = new JavaDomain(filePath);

            if (domain.isNeedCompile()) {
                ProjectSystem.addToCompile(domain.getProjectName(), domain);

                /**
                 * 保证需要编译的java文件完整性  不会漏掉
                 */
                ProjectSystem.getCountJava(domain.getProjectName()).countDown();

                /**
                 * 激活编译线程
                 */
                ProjectSystem.activeCompileTask(domain.getProjectName());

                logger.info("waiting compile");

                try {
                    ProjectSystem.getStartSignal(domain.getProjectName()).await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                /**
                 * 防止有的内部类没有加载
                 */
                domain.resetClass();
                copyClassesFile(domain);
            }
            else {
                ProjectSystem.getCountJava(domain.getProjectName()).countDown();
                copyClassesFile(domain);
            }
        } else {
            chain.doHandler(chain.nextHandler());
        }
        return null;
    }


    /**
     *  1.当用idea build项目的时候，所有文件不需要编译，但需要复制
     *  2.这个java文件的所有类，非共有类，通过java文件读取class标记获取，内部类通过编译的文件目录，匹配java文件名称和$符号进行获取
     *  当编译之后需要充值domain里面的编译类路径，因为每次编译之后 因为有的domain刚刚开始没有编译的时候没有内部类的
     */
    private void copyClassesFile(JavaDomain domain) {
//        logger.info();
        Tools.copyFile(domain.getCompilePath(), domain.getOutPutPath());
    }

    public static void main(String[] args) {
        new JavaHandler().handler(null, "D:\\ideaproject1\\wt_pay\\src\\com\\ct10000\\page\\util\\RequestParameterUtils.java");

//        String ss = new JavaHandler().getCompileClassFilePath("D:\\ideaproject1\\wap3.0\\src\\com\\ct10000\\jobstart\\JobStart.java");
//        System.out.println(ss);

//        List<String> list = new ArrayList();
//        new JavaHandler().containInnerClass("I:\\jbProject\\javastudy\\out\\production\\javastudy\\com\\lang\\thread\\ThreadLocalDemo1.class",list);
//        System.out.println(new JavaHandler().getOutputClassFilePath("D:\\ideaproject1\\wap3.0\\src\\com\\ct10000\\jobstart\\JobStart.java"));

        String ss = "class a{ class b {}} class c{}";
    }

    @Override
    public String toString() {
        return "JavaHandler{}";
    }
}
